﻿using System;
using System.Linq;
using xWF.Examples.Tkmv.Transitions;

namespace xWF.Examples.Tkmv
{
	public sealed class TkmvWorkflow : Workflow<TkmvWorkItem>
	{
		/// <summary>
		/// Добавление состояний и переходов
		/// </summary>
		private void MakeStates()
		{
            AddAllStateTransitions(
                new DebugOnlyResetButton(),
                new ExcelImportButton()
            );

			AddState(TkmvStatus.New,
                new TkmvDeleteButton()
			);
		}

		public TkmvWorkflow(int tkmvId)
		{
			WorkItem = new TkmvWorkItem(tkmvId);
			MakeStates();
		}

		public override IWorkflowState<TkmvWorkItem> CurrentState
		{
			get { return new TkmvState(WorkItem.CardStatus()); }
			protected set { }
		}

		/// <summary>
		/// Доступные кнопки для перехоа
		/// </summary>
		/// <returns></returns>
		public TkmvButtonTransitions[] AvailableButtons()
		{
			return AvailableTransitions()
				.OfType<TkmvButtonTransitions>()
				.Where(x => x.CanExecute(WorkItem))
				.ToArray();
		}

		/// <summary>
		/// Переход по кнопке
		/// </summary>
		/// <param name="name"></param>
		/// <returns>Отображаемая пользователю ошибка</returns>
        public TkmvButtonTransitions ClickButton(string name)
		{
			var buttons = AvailableButtons().Where(x => x.Name == name).ToArray();

			if (buttons.Length == 0)
			{
				throw new InvalidOperationException(string.Format("В текущем состояние переход по кнопке {0} отсутствует", name));
			}

			if (buttons.Length > 1)
			{
				throw new InvalidOperationException(string.Format("В текущем состояние присутствует более одного перехода по кнопке {0}", name));
			}

			var button = buttons[0];
			Execute(button);

			return button;
		}

		private void AddState(TkmvStatus status, params IWorkflowTransition<TkmvWorkItem>[] transitions)
		{
			AddState(new TkmvState(status), transitions);
		}
	}
}